// #include<iostream>
// #include<vector>
// #include<unistd.h>
// #include"mythread.hpp"
// using namespace std;

// #define NUM 4

// int ticket=10000;

// void run()
// {
//     while(true)
//     {
//         if(ticket>0)
//         {
//             usleep(1000);
//             cout<<ticket--<<endl;
//         }
//         else
//         {
//             break;
//         }
//     }
// }

// int main()
// {
//     std::vector<Thread> threads;
//     for(int i=0;i<NUM;i++)
//     {
//         threads.emplace_back(run);
//     }
//     for(auto& t:threads)
//     {
//         t.Start();
//     }
//     for(auto& t:threads)
//     {
//         t.Join();
//     }
//     return 0;
// }

#include <iostream>
#include <vector>
#include <unistd.h>
#include "mythread.hpp"
using namespace std;

#define NUM 4

int ticket = 10000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void run()
{
    while (true)
    {
        pthread_mutex_lock(&mutex);
        if (ticket > 0)
        {
            usleep(1000);
            cout << ticket-- << endl;
            pthread_mutex_unlock(&mutex);
        }
        else
        {
            pthread_mutex_unlock(&mutex);

            break;
        }
    }
}

int main()
{
    std::vector<Thread> threads;
    for (int i = 0; i < NUM; i++)
    {
        threads.emplace_back(run);
    }
    for (auto &t : threads)
    {
        t.Start();
    }
    for (auto &t : threads)
    {
        t.Join();
    }
    return 0;
}